summaryrefslogtreecommitdiffstats
path: root/src/video_core/host_shaders/convert_non_msaa_to_msaa.comp
blob: c7ce38efa6e7f43724b9334cb18c97570017fe02 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#version 450 core
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;

layout (binding = 0, rgba8) uniform readonly restrict image2DArray img_in;
layout (binding = 1, rgba8) uniform writeonly restrict image2DMSArray output_msaa;

void main() {
    const ivec3 coords = ivec3(gl_GlobalInvocationID);
    if (any(greaterThanEqual(coords, imageSize(output_msaa)))) {
        return;
    }

    // TODO: Specialization constants for num_samples?
    const int num_samples = imageSamples(output_msaa);
    const ivec3 msaa_size = imageSize(output_msaa);
    const ivec3 out_size = imageSize(img_in);
    const ivec3 scale = out_size / msaa_size;
    for (int curr_sample = 0; curr_sample < num_samples; ++curr_sample) {
        const int single_sample_x = scale.x * coords.x + (curr_sample & 1);
        const int single_sample_y = scale.y * coords.y + ((curr_sample / 2) & 1);
        const ivec3 single_coords = ivec3(single_sample_x, single_sample_y, coords.z);

        if (any(greaterThanEqual(single_coords, imageSize(img_in)))) {
            continue;
        }
        const vec4 pixel = imageLoad(img_in, single_coords);
        imageStore(output_msaa, coords, curr_sample, pixel);
    }
}